<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Title</title>
</head>
<body>

</body>
<script>
	// ### 6.1、介绍
	// * 在JavaScript中，`call`、`apply`和`bind`是`Function`对象自带的三个方法。
	// {
	// 	function fn(){
	//
	// 	}
	// 	// ƒ call() { [native code] } ƒ apply() { [native code] } ƒ bind() { [native code] }
	// 	console.log(fn.call,fn.apply,fn.bind)
	// }
	
	
	// * call()、apply()、bind() 都是用来重定义 this 这个对象的！
	
	// {
	// 	// 1- 如果指定的是基本包装类型，那么this指向的是相对应的包装对象。
	// 	// 2- 如果指定的是undefined,null,那么this指向的是window
	// 	// 3- 如果指定的是引用类型，那么this即是该引用类型的值
	//
	// 	function fn(){
	// 		// "use strict";
	// 		console.log(this);
	// 	}
	// 	fn();// window
	// 	// fn.call(1);
	// 	// fn.call("11");
	// 	// fn.call(true);
	// 	// fn.call(undefined);
	// 	// fn.call(null);
	// 	// fn.call([1,2,3]);
	// 	// fn.call({a:1,b:2,c:3});
	// 	// fn.call(function(){})
	//
	// 	// fn.apply(1);
	// 	// fn.apply("11");
	// 	// fn.apply(true);
	// 	// fn.apply(undefined);
	// 	// fn.apply(null);
	// 	// fn.apply([1,2,3]);
	// 	// fn.apply({a:1,b:2,c:3});
	// 	// fn.apply(function(){})
	//
	// 	fn.bind(1)();
	// 	fn.bind("11")();
	// 	fn.bind(true)();
	// 	fn.bind(undefined)();
	// 	fn.bind(null)();
	// 	fn.bind([1,2,3])();
	// 	fn.bind({a:1,b:2,c:3})();
	// 	fn.bind(function(){})()
	// }
	// * **call 、bind 、 apply 传参情况**
	// * call 的参数是直接放进去的，第二第三第 n 个参数全都用逗号分隔，直接放到后面
	// {
	// 	function fn(a,b,c,d){
	// 		console.log(a,b,c,d,this);// 2 3 4 undefined 1对应的包装对象
	// 	}
	// 	fn.call(1,2,3,4);
	// }
	// * apply 的所有参数都必须放在一个数组里面传进去
	// {
	// 	function fn(a,b,c,d){
	// 		console.log(a,b,c,d,this);// 2 3 4 undefined 1对应的包装对象
	// 	}
	// 	fn.apply(1,[2,3,4]);
	// }
	
	// * bind 除了返回是函数以外，它的参数和 call 一样
	{
		// bind不仅可以绑定this,也可以绑定参数
		function fn(a,b,c,d){
			console.log(a,b,c,d,this);// 2 3 4 5 Number{1}
		}
		fn.bind(1,2,3)(4,5);
		const fn2 = fn.bind(1,2,3);
		fn2(4,5);
		fn2(100,200);// // 2 3 100 200 Number{1}
	}
</script>
</html>